package NiuKe;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Queue;
import java.util.Stack;

/**
 * 动物牛牛是一个聪明的动物，它现在面临一个字符串解码的问题。
 * 给定一个经过编码的字符串，牛牛需要将其解码成原始的字符串。
 * 编码规则为：k[encoded_string]，表示其中方括号内部的
 * encoded_string 正好重复 k 次。注意 k 保证为正整数。
 * 请你编写一个函数decodeString，接收一个字符串s作为参数，
 * 返回解码后的字符串。
 * 3[a2[c]]
 * 3 2
 * a c cc
 */
public class NiuKe_FZ2 {
    public static void main(String[] args) {
        String s = decodeString("abc3mn]xy");
        System.out.println(s);
    }
    public static String decodeString (String s) {
        Stack<Character> fh = new Stack<>();
        if(s.length() <= 0){
            return null;
        }
        // write code here
        ArrayList<Integer> k = new ArrayList<>();
        ArrayList<String> str = new ArrayList<>();
        int b = 0;
        int e = 0;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) >= 48 && s.charAt(i) <= 57){
                b = i + 1;
                e = b + 1;
                if(s.charAt(b) != 91){
                    throw new RuntimeException("字符串错误");
                }
                fh.push(s.charAt(b));
                while (!fh.empty() && e < s.length()){
                    if (s.charAt(e) == 91){
                        fh.push(s.charAt(e));
                    }
                    if(s.charAt(e) == 93){
                        fh.pop();
                    }
                    e++;
                }
                k.add(Integer.valueOf(s.substring(i,i+1)));
                String add = decodeString(s.substring(b + 1, --e));
                str.add(add);
                i = e;
            }else{
                k.add(1);
                str.add(s.substring(i,i+1));
            }
        }
        StringBuilder result = new StringBuilder(100);
        for (int i = 0; i < k.size(); i++) {
            StringBuilder add = new StringBuilder(100);
            for (int j = 0; j < k.get(i); j++) {
                add.append(str.get(i));
            }
            result.append(add);
        }
        return String.valueOf(result);
    }
}
